#include  "Llista_id.h"
#include <string.h>
#include <stdio.h>



    /* Funcions internes */
    void quicksort(int iz, int de);
 
    /* Estructura d'emmagatzematge dels toquens identificador */
    typedef struct {
            char identifier[20];
            int   valor;
    } Id_token ;


    Id_token llista_id[TAMANY_LLISTA];  
    int last_pos = 0;

    int contador_IDs_guardats=0;
    int Id_offset = 330;  



    /* Mofidicar offset valor_token = valor_pos + offset */
    int Ll_ModificarOffset(int offset)
    {
        Id_offset = offset;
	return 0;
    }


    int Ll_ConsultarOffset(int offset)
    {
        return (Id_offset);
    }

    void Ll_Ini_Keywords()
    {
/*        Ll_Insertar("identifier",257);
        Ll_Insertar("string_literal",259);*/
        Ll_Insertar("sizeof",260);
        Ll_Insertar("type_name",282);
        Ll_Insertar("typedef",283);
        Ll_Insertar("extern",284);
        Ll_Insertar("static",285);
        Ll_Insertar("auto",286);
        Ll_Insertar("register",287);
        Ll_Insertar("char",288);
        Ll_Insertar("short",289);
        Ll_Insertar("int",290);
        Ll_Insertar("long",291);
        Ll_Insertar("signed",292);
        Ll_Insertar("unsigned",293);
        Ll_Insertar("float",294);
        Ll_Insertar("double",295);
        Ll_Insertar("const",296);
        Ll_Insertar("volatile",297);
        Ll_Insertar("void",298);
        Ll_Insertar("struct",299);
        Ll_Insertar("union",301);
        Ll_Insertar("enum",302);
        Ll_Insertar("range",303);
        Ll_Insertar("case",304);
        Ll_Insertar("default",305);
        Ll_Insertar("if",306);
        Ll_Insertar("else",307);
        Ll_Insertar("switch",308);
        Ll_Insertar("while",309);
        Ll_Insertar("do",310);
        Ll_Insertar("for",311);
        Ll_Insertar("goto",312);
        Ll_Insertar("continue",313);
        Ll_Insertar("break",314);
        Ll_Insertar("return",315);
        
    }


    int Ll_Insertar(char identifier[20], int id)
    {
        if (id != 0){        
                strcpy( llista_id[last_pos].identifier, identifier);
                llista_id[last_pos].valor = id;
        
                last_pos ++;
                quicksort(0,last_pos-1);
                return(id);
        }
        else
        {
                strcpy( llista_id[last_pos].identifier, identifier);
                llista_id[last_pos].valor = Id_offset + contador_IDs_guardats;
        
                contador_IDs_guardats++;        
                last_pos ++;
                quicksort(0,last_pos-1);
                return(contador_IDs_guardats-1);
        }
    }
/*
    int Ll_Insertar(char identifier[20])
    {
        
        strcpy( llista_id[last_pos].identifier, identifier);
        //printf("%s\n",llista_id[last_pos].identifier);
        llista_id[last_pos].valor = Id_offset + contador_IDs_guardats;

        contador_IDs_guardats++;        
        last_pos ++;
        quicksort(0,last_pos-1);
        return(contador_IDs_guardats-1);
    }
*/

    int Ll_Treure (char identifier[20])
    {
        /*Cerca dicotomica dintre de l'estructura*/        
        return(0);
    }


    /* Dona la posicio que ocupa, si no existeix retorna -1*/
    int Ll_Consultar(char identifier[20])
    {
        
        /* Búsqueda binaria en vector ordenado. */
        int centro;
        int encontrado = 0;
        int izquierda = 0;
        int derecha = last_pos-1;

        while (! encontrado && izquierda <= derecha)
        {
            centro = (izquierda + derecha) / 2;
            if ( (strcmp(identifier, llista_id[centro].identifier)) < 0 )
                derecha = centro - 1;
            else if ( (strcmp(identifier, llista_id[centro].identifier)) > 0)
                izquierda = centro + 1;
            else
            encontrado = 1;
        }

        /* Escritura en pantalla del vector ordenado. */
        if (encontrado)
            return(llista_id[centro].valor);
        else
            return(-1); 
            
        
    }
    

    void quicksort(int iz, int de) 
    {
	    int i, j;
	    char pivot[20];
	    Id_token temp;

	    i = iz;
	    j = de;
	    strcpy (pivot, llista_id[(iz + de) / 2].identifier);
	    do {
            while ( (strcmp (llista_id[i].identifier, pivot)) < 0)
		    	i++;
            while ( (strcmp(pivot,llista_id[j].identifier)) < 0)
		    	j--;
		    if (i <= j) {
		    	temp.valor = llista_id[i].valor;	/* intercanviar llista_id[i] i llista_id[j] */
                strcpy(temp.identifier, llista_id[i].identifier);

		    	llista_id[i].valor = llista_id[j].valor;
                strcpy(llista_id[i].identifier,llista_id[j].identifier);

		    	llista_id[j].valor = temp.valor;
                strcpy(llista_id[j].identifier,temp.identifier);
		    	i++;
		    	j--;
		    }
	    } while (i <= j);
	    if (iz < j)
    		quicksort(iz, j);
	    if (i < de)
	    	quicksort(i, de);
    }

    void Ll_print()
    {   
        int i;
        printf("\nLlista de tokens:\n");
        for(i=0;i<last_pos;i++)
            printf("(%s, %i)\n",llista_id[i].identifier,llista_id[i].valor);
    }
